firewalld - Le pare-feu facile sous Linux

Table des matières

firewalld - Le pare-feu facile sous Linux

Introduction

Informations générales sur firewalld

firewalld et les zones

Concept des zones

Gérer les zones

Lister les zones

Lister le paramétrage des zones

Créer et supprimer des zones

Gestion de la zone par défaut

Affecter des zones aux interfaces

Affecter des zones aux sources (sous-réseau / IP)

firewalld : Les services

Notion de service

Créer, exporter et importer des services personnalisés (à venir)

firewalld : Autoriser des services et des ports dans le pare-feu

Autoriser ou retirer des services

Lister les services autorisés dans une zone

Autoriser ou retirer des ports et protocoles

Lister les ports autorisés dans une zone

firewalld : Opérations avancées

NAT/PAT : Port forwarding

firewalld : Export et Import de la config

 

Introduction



firewalld est un pare-feu sous Linux qui est facile à mettre en oeuvre et paramétrer, par rapport à iptables ou son successeur nftables.
Il est livré par défaut sous CentOS et Fedora, mais il est possible de l'installer sur d'autres distributions Linux telles que Gentoo ou Debian.

Il est à mon gout le pare-feu idéal qui allie flexibilité, simplicité et efficacité.

Il fonctionne évidemment avec IPv4 et IPv6 !

Pour suivre cet article, quelques notions de réseau et de parefeu sont recommandées :):)

Cet article est à but de mémo et surtout c'est qu'on n'a pas beaucoup de doc de qualité et synthétisée en français sur ce parefeu !

Certaines commandes seront utilisées avec des exemples pour plus de simplicité

Informations générales sur firewalld



Après avoir installé le pare-feu, celui-ci est lancé en tant que service :

Sous systemd :

Code BASH :

systemctl status firewalld



Sous OpenRC :

Code BASH :

/etc/init.d/firewalld status



Firewalld prévoit une commande pour vérifier son statut :

Code BASH :

firewall-cmd --state



Si la commande renvoie running c'est que le pare-feu est en fonctionnement.

La commande permettant de gérer firewalld s'appelle firewall-cmd.
Firewalld est gérable en graphique avec firewall-config
Firewalld est gérable en interface web si Cockpit est installé sur a machine (utile pour les serveurs)

Concernant le comportement de la commande firewall-cmd

Une commande du style :

Code BASH :

firewall-cmd --add-port=22/tcp



Prendra effet dès la validation. Cependant, si le parefeu est redémarré ou la configuration rechargée, la commande n'est pas mémorisée. Il faudra pour cela ajouter l'option --permanent à la commande :

Code BASH :

firewall-cmd --add-port=22/tcp --permanent



L'option --permanent permet de rendre permanente la configuration, mais ne prend effet qu'après avoir rechargé la configuration du parefeu. Pour recharger la configuration du pare-feu :

Code BASH :

firewall-cmd --reload



Donc dans la suite de cet article, je préciserai avec [--permanent] en fin de ligne les commandes supportant cette option.
Vous aurez donc compris que sans, la règle s'applique de suite mais de manière éphémère, et qu'avec il est nécessaire de recharger la configuration du pare-feu après.

firewalld et les zones

 

Concept des zones



Firewalld fonctionne avec la notion de zone. Avant de savoir quelle zone on utilise et comment les changer et les gérer, je vous explique rapidement les zones existantes. Chaque zone dispose de règles et de comportements par défaut.

Pour voir la liste des zones créées sur la machine, on utilisera

Code BASH :

firewall-cmd --get-zones



Voici une explication concernant les différentes zones :

- drop : Niveau de confiance minimal. Toute connexion entrante est ignorée (sans notification) et les connexions sortantes sont autorisées
- block : Niveau de confiance minimal. Toute connexion entrante est ignorée (avec notification icmp-host-prohibited ou icmp6-adm-prohibited) et les connexions sortantes sont autorisées
- public : Niveau de confiance bas (zone par défaut sous CentOS) : Certaines connexions entrantes sont acceptées (ssh par exemple) et on peut en ajouter à la demande à l'aide des règles.
- external : Zone dans laquelle on va placer une interface reliée à une réseau externe (WAN par exemple) quand on utilise le serveur comme passerelle. Le MASQUERADE NAT (qu'on connait dans iptables) est activé.
- internal : Zone de l'autre côté de l'external quand on utilise le serveur comme passerelle. Cette zone est de bonne confiance, et on peut éditer les services acceptés avec des règles.
- dmz : Zone réservée pour les serveurs étant dans une DMZ (zone démilitarisée). Quelques connexions entrantes sont autorisées.
- work : Niveau de confiance bonne : Zone utilisée pour les machines de travail, La plupart des connexions entrantes sont autorisées, et on peut éditer les services acceptés avec des règles.
- home : Niveau de confiance bonne : Zone utilisée pour une zone personnelle. La plupart des connexions entrantes sont autorisées, et on peut éditer les services acceptés avec des règles.
- trusted : Niveau de confiance élevée : Zone utilisée pour les machines qui se font 100% confiance. A utiliser avec précaution évidemment.

On peut évidemment créer des zones personnalisées.

Gérer les zones

 

Lister les zones



Pour voir la liste des zones créées sur la machine, on utilisera

Code BASH :

firewall-cmd --get-zones



Pour lister toutes les zones et leur paramétrage actuel, on utilisera :

Code BASH :

firewall-cmd --list-all-zones


Lister le paramétrage des zones



Pour lister le paramétrage actuel d'une zone :

Code BASH :

firewall-cmd --info-zone lazone



Exemple avec la zone public :

Code BASH :

# firewall-cmd --info-zone public

public

  target: default

  icmp-block-inversion: no

  interfaces:

  sources:

  services: dhcpv6-client http https mdns ssh

  ports:

  protocols:

  masquerade: no

  forward-ports:

  source-ports:

  icmp-blocks:

  rich rules:

 

 

Créer et supprimer des zones



On peut créer sa propre zone, par exemple ici avec la zone "mesvps" :

Code BASH :

firewall-cmd --new-zone=mesvps --permanent

firewall-cmd --reload



Le paramétrage de la zone est vide par défaut

On peut supprimer des zones personnalisée avec :

Code BASH :

firewall-cmd --delete-zone=mazone --permanent

firewall-cmd --reload

 

Gestion de la zone par défaut



Par défaut, quand la commande firewall-cmd est invoquée, la règle s'applique à la zone par défaut.

Pour vérifier la zone utilisée par défaut :

Code BASH :

 firewalld-cmd --get-default-zone



Et pour définir une autre zone par défaut (exemple avec une définition de la zone par défaut sur work) :

Code BASH :

 firewall-cmd --set-default-zone=work


Affecter des zones aux interfaces



Chaque interface du système peut être attribuée à une zone.

Si on ne précise pas le --zone=lazone la commande s'effectuera sur la zone par défaut.

Pour ajouter l'interface ens192 à la zone work en l'enlevant de sa précédente zone :

Code BASH :

firewall-cmd --change-interface=ens192 --zone=work [--permanent]



Pour retirer l'interface ens192 de la zone work :

Code BASH :

firewall-cmd --remove-interface=ens192 --zone=work [--permanent]



Pour ajouter l'interface ens192 à la zone work (interface qui ne soit pas âtre affectée à une zone) :

Code BASH :

firewall-cmd --add-interface=ens192 --zone=work [--permanent]


Affecter des zones aux sources (sous-réseau / IP)



On peut affecter des interfaces à des zones, mais aussi des sources.
Quand on ne dispose que d'une seule interface, il peut être utile de définir par exemple la zone public par défaut, mais la zone work pour un sous-réseau et/ou la zone trusted pour une machine spécifique.

Si on ne précise pas le --zone=lazone la commande s'effectuera sur la zone par défaut.

Pour ajouter le sous-réseau 192.168.21.0/24 à la zone work :

Code BASH :

 firewall-cmd --zone=work --add-source=192.168.21.0/24 [--permanent]



Pour ajouter une IP seule (192.168.21.200) à la zone trusted :

Code BASH :

 firewall-cmd --zone=work --add-source=192.168.21.200 [--permanent]



Pour retirer le sous-réseau 192.168.21.0/24 de la zone work :

Code BASH :

 firewall-cmd --zone=work --remove-source=192.168.21.0/24 [--permanent]



Pour ajouter le sous-réseau 192.168.21.0/24 à la zone work en l'enlevant de sa précédente zone :

Code BASH :

 firewall-cmd --zone=work --change-source=192.168.21.0/24 [--permanent]


firewalld : Les services

 

Notion de service



Firewalld dispose de services préconfigurés. Ainsi, il sera plus facile d’ouvrir un port et un protocole grâce à son nom.

Pour lister les services préinstallés :

Code BASH :

firewall-cmd --get-services



On remarque par exemple le service "ssh". Pour avoir des infos sur le service :

Code BASH :

firewall-cmd --info-service ssh



On voit que ce service correspond au port 22 en TCP.

Code TEXT :

ssh

  ports: 22/tcp

  protocols:

  source-ports:

  modules:

  destination:

  includes:

 

 

Créer, exporter et importer des services personnalisés (à venir)



A venir

firewalld : Autoriser des services et des ports dans le pare-feu



Le titre est assez simpliste. Si je voulais être complet, je dirais plutôt : Autoriser un service ou un port dans une zone.

Autoriser ou retirer des services



Si on ne précise pas le --zone=lazone la commande s'effectuera sur la zone par défaut.

Si on veut autoriser le service http :

Code BASH :

firewall-cmd --add-service=http [--permanent]



Si on veut retirer le service http :

Code BASH :

firewall-cmd --remove-service=http [--permanent]


Lister les services autorisés dans une zone



Si on ne précise pas le --zone=lazone la commande s'effectuera sur la zone par défaut.

Pour lister les services autorisés dans une zone (exemple avec la zone work) :

Code BASH :

firewall-cmd --list-services --zone work


Autoriser ou retirer des ports et protocoles



Si on ne précise pas le --zone=lazone la commande s'effectuera sur la zone par défaut.

Si on veut autoriser un port, il faut spécifier le port ET le protocole utilisé (Exemple Port 1234 en TCP ) :

Code BASH :

firewall-cmd  --add-port=1234/udp [--permanent]



On peut aussi autoriser une plage de ports (Exemple ici d'un serveur avec plusieurs sessions VNC, des ports 5900 à 5950 en TCP ) :

Code BASH :

firewall-cmd  --add-port=5900-5950/tcp [--permanent]


Lister les ports autorisés dans une zone



Si on ne précise pas le --zone=lazone la commande s'effectuera sur la zone par défaut.

Pour lister les services autorisés dans une zone (exemple avec la zone work) :

Code BASH :

firewall-cmd --list-ports --zone work


firewalld : Opérations avancées

 

NAT/PAT : Port forwarding



Grâce à firewalld, on peut transférer des requêtes d'un port sur un autre port. Ou même de transférer une requête d'un port sur une autre IP et un autre port.

Dans ce cas, les zones external/internal sont bonnes.

Voici la syntaxe à utiliser :

Code BASH :

firewall-cmd --zone=external --add-forward-port=port=:proto=:toaddr=:toport= [--permanent]



Voici un exemple avec un NAT/PAT du port HTTP vers l'IP 172.21.21.10 :

Code BASH :

firewall-cmd --zone=external --add-forward-port=port=80:proto=tcp:toaddr=172.21.21.10:toport=80 --permanent

 

firewalld : Export et Import de la config



Il peut être utile d'exporter la config du pare-feu pour la réimporter (sauvegarde, import dans une nouvelle machine)..

La conf se trouve dans /etc/firewalld. Il suffit de sauvegarder ces fichiers.

firewalld.conf : Fichier principal de conf, à garder si modifié.
zones : Dossier contenant la confg des zones.

Les dossiers helpers icmptypes ipsets et services sont vides si vous ne créez pas vous même ces éléments.